{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "true"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "### pry-docの読み込み\n",
    "require \"/root/git_jupyter_notebook/Ruby/vendor/bundle/ruby/2.3.0/gems/pry-doc-0.10.0/lib/pry-doc\"\n",
    "#require \"/Users/ftakao2007/jupyter/vendor/bundle/ruby/2.3.0/gems/pry-doc-0.10.0/lib/pry-doc\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "# Timeクラス\n",
    "\n",
    "* Timeクラス\n",
    "    * 時刻を表すクラス\n",
    "        * 世界標準時(UTCまたはGMT)の1970年1月1日午前0時からの経過秒数で保持\n",
    "        * タイムゾーンとしてUTCか地方時刻を設定することができる\n",
    "            * 内部的には環境にある時刻システムを利用している\n",
    "                * <font color=\"red\">環境に応じて取れる時刻の範囲が異なる</font>\n",
    "                * 負の時刻が許される環境や32bit,64bitによりエラーになる場合とならない場合がある"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "* メソッド\n",
    "    * Time.new\n",
    "        * 現在時刻のTimeオブジェクトを生成して返す\n",
    "        * タイムゾーンはローカルタイム\n",
    "            * 日本は0900と表記される\n",
    "    * Time.now\n",
    "        * Time.newと同じ\n",
    "    * Time.at\n",
    "        * 引数で指定した起算時からの秒数に対するTimeオブジェクトを生成して返す\n",
    "    * Time.mktime\n",
    "        * 与えられた引数に対応するTimeオブジェクトを生成する\n",
    "        * <font color=\"red\">引数の数に応じて引数の意味が変わる</font>\n",
    "            * 引数が7個まで ()はデフォルト\n",
    "                * 先頭から「年(省略不可)」「月(1)」「日(1)」「時(0)」「分(0)」「秒(0)」「マイクロ秒(0)」\n",
    "                * 月\n",
    "                    * 「Jan」「Feb」など英語の月名の省略形で記述可能\n",
    "                * 年\n",
    "                    * 0から38までは2000が加算される\n",
    "                    * 69以上138以下は1900が加算される\n",
    "                        * されてる？\n",
    "            * 引数が10個\n",
    "                * 「秒」「分」「時」「日」「月」「年」「曜日に対応する数値」「年日」「夏時間かどうかの真理値」「タイムゾーン」\n",
    "                * 「曜日に対応する数値」「年日」「夏時間かどうかの真理値」「タイムゾーン」は無視される\n",
    "                * この順序は、Timeオブジェクトのto_aメソッドの結果と同じ順序\n",
    "    * Time.local\n",
    "        * Time.mktimeと同じ\n",
    "    * Time.gm"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2017-05-29 01:17:19 +0900\n",
      "2017-05-29 01:17:19 +0900\n",
      "\n",
      "もとにしている時刻から10秒経過した時刻\n",
      "1970-01-01 09:00:10 +0900\n",
      "さらにマイクロ秒で2秒後を指定\n",
      "1970-01-01 09:00:12 +0900\n",
      "\n",
      "Time.atと違いマイクロ秒の指定で秒数までの桁を指定すると「ArgumentError: argument out of range」になる\n",
      "ArgumentErrorが発生しました。 argument out of range\n",
      "エラーが発生しないマイクロ秒数の指定\n",
      "2017-02-03 13:35:30 +0900\n",
      "\n",
      "引数10個指定。年日(引数の7個目)以降は無視される?\n",
      "2015-07-03 09:34:12 +0900\n",
      "2015-07-03 09:34:12 +0900\n"
     ]
    }
   ],
   "source": [
    "puts Time.new\n",
    "puts Time.now\n",
    "puts\n",
    "\n",
    "puts \"もとにしている時刻から10秒経過した時刻\"\n",
    "puts Time.at(10)\n",
    "puts \"さらにマイクロ秒で2秒後を指定\"\n",
    "puts Time.at(10, 2000000)\n",
    "puts\n",
    "\n",
    "puts \"Time.atと違いマイクロ秒の指定で秒数までの桁を指定すると「ArgumentError: argument out of range」になる\"\n",
    "begin\n",
    "  puts Time.mktime(2017,2,3,13,35,30,4000000)\n",
    "rescue ArgumentError => ex\n",
    "  puts \"ArgumentErrorが発生しました。 #{ex}\"\n",
    "ensure\n",
    "  puts \"エラーが発生しないマイクロ秒数の指定\"\n",
    "  puts Time.mktime(2017,2,3,13,35,30,4000)  \n",
    "end\n",
    "puts \n",
    "\n",
    "puts \"引数10個指定。年日(引数の7個目)以降は無視される?\"\n",
    "puts Time.mktime(12,34,9,3,7,2015,4,188,false,\"UTC\")\n",
    "puts Time.mktime(12,34,9,3,7,2015,4,188,false,\"JST\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "## Timeオブジェクトの属性を取得する\n",
    "\n",
    "* メソッド\n",
    "    * year\n",
    "        * 年を取得する\n",
    "    * mon, month\n",
    "        * 月を取得する\n",
    "    * day, mday\n",
    "        * 日を取得する\n",
    "    * hour\n",
    "        * 時を取得する\n",
    "    * min\n",
    "        * 分を取得する\n",
    "    * sec\n",
    "        * 秒を取得する\n",
    "    * usec, tv_usec\n",
    "        * マイクロ秒を取得する\n",
    "    * wday\n",
    "        * 曜日に対応する数値\n",
    "        * 0～6, 日曜日～土曜日\n",
    "    * yday\n",
    "        * 1月1日からの日数\n",
    "    * zone\n",
    "        * タイムゾーン\n",
    "    * isdst, dst?\n",
    "        * 夏時間かどうか\n",
    "    * gmt?, utc?\n",
    "        * タイムゾーンがutcかどうか\n",
    "    * gmt_offset, gmtoff\n",
    "        * UTCとの差を秒単位の数値として返す"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2015\n",
      "7\n",
      "7\n",
      "3\n",
      "3\n",
      "9\n",
      "34\n",
      "12\n",
      "この形式ではusecは無し\n",
      "0\n",
      "0\n",
      "曜日。インスタンス作成時は4にしているが無視して正しい5(金曜日)が指定されている\n",
      "5\n",
      "1月1日からの日数\n",
      "184\n",
      "JSTを指定しているがローカルのシステムはUTCなのでUTCと表示されている\n",
      "UTC\n",
      "夏時間かどうか\n",
      "false\n",
      "false\n"
     ]
    }
   ],
   "source": [
    "t = Time.mktime(12,34,9,3,7,2015,3,188,false,\"JST\")  \n",
    "\n",
    "puts t.year\n",
    "puts t.mon\n",
    "puts t.month\n",
    "puts t.day\n",
    "puts t.mday\n",
    "puts t.hour\n",
    "puts t.min\n",
    "puts t.sec\n",
    "puts \"この形式ではusecは無し\"\n",
    "puts t.usec\n",
    "puts t.tv_usec\n",
    "puts \"曜日。インスタンス作成時は4にしているが無視して正しい5(金曜日)が指定されている\"\n",
    "puts t.wday\n",
    "puts \"1月1日からの日数\"\n",
    "puts t.yday\n",
    "puts \"JSTを指定しているがローカルのシステムはUTCなのでUTCと表示されている\"\n",
    "puts t.zone\n",
    "puts \"夏時間かどうか\"\n",
    "puts t.isdst\n",
    "puts t.dst?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2000-01-01 20:15:01 UTC\n",
      "true\n",
      "true\n",
      "0\n",
      "0\n"
     ]
    }
   ],
   "source": [
    "t = Time.utc(2000,1,1,20,15,1)\n",
    "puts t\n",
    "puts t.gmt?\n",
    "puts t.utc?\n",
    "puts t2.gmt_offset\n",
    "puts t2.gmtoff"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "## タイムゾーンを変更する\n",
    "\n",
    "* メソッド\n",
    "    * localtime\n",
    "        * タイムゾーンをローカルにする\n",
    "    * gmtime, utc\n",
    "        * UTCにする\n",
    "    * getlocal\n",
    "        * タイムゾーンをローカルに変更した新しいTimeオブジェクトを生成する\n",
    "    * getgm. getutc\n",
    "        * UTCに変更した新しいTimeオブジェクトを生成する\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2000-01-01 20:15:01 +0000\n",
      "2000-01-01 20:15:01 UTC\n",
      "2000-01-01 20:15:01 UTC\n",
      "2000-01-01 20:15:01 +0000\n",
      "2000-01-01 20:15:01 UTC\n",
      "2000-01-01 20:15:01 UTC\n"
     ]
    }
   ],
   "source": [
    "t = Time.utc(2000,1,1,20,15,1)\n",
    "puts t.localtime\n",
    "puts t.gmtime\n",
    "puts t.utc\n",
    "puts t.getlocal\n",
    "puts t.getgm\n",
    "puts t.getutc"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "## Timeオブジェクトの演算\n",
    "\n",
    "* メソッド\n",
    "    * +\n",
    "        * 指定した秒数後のTimeオブジェクトを返す\n",
    "    * -\n",
    "        * 指定した秒数前のTimeオブジェクトを返す\n",
    "    * Timeオブジェクト同士の演算\n",
    "        * 時間差を秒で表したFloatオブジェクトを返す\n",
    "        "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2000-01-01 20:15:01 UTC\n",
      "2000-01-01 20:21:01 UTC\n",
      "2000-01-01 20:09:01 UTC\n",
      "一か月差を計算\n",
      "31.0\n"
     ]
    }
   ],
   "source": [
    "puts t = Time.utc(2000,1,1,20,15,1)\n",
    "puts t+360\n",
    "puts t-360\n",
    "\n",
    "t2 = Time.utc(2000,2,1,20,15,1)\n",
    "puts \"一か月差を計算\"\n",
    "puts (t2 - t) / 60 / 60 / 24"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "## Timeオブジェクトの変換\n",
    "\n",
    "* メソッド\n",
    "    * to_i, tv_sec\n",
    "        * 起算日からの秒数を整数で返す\n",
    "    * to_f\n",
    "        * 起算日からの秒数を浮動小数点で返す\n",
    "    * to_a\n",
    "        * 「秒」「分」「時」「日」「月」「年」「曜日に対応する数値」「年日」「夏時間かどうかの真理値」「タイムゾーン」の配列を返す\n",
    "    * to_s\n",
    "        * UNIXのdateコマンドのような結果を返す\n",
    "    * strftime\n",
    "        * 指定したフォーマットに従って文字列に変換した結果を返す\n",
    "        * フォーマット\n",
    "            * %A : 曜日の英語名 (Sunday, ...)\n",
    "            * %a : 曜日の英語名の省略形 ( Sun, ...)\n",
    "            * %B : 月の英語名 (January, ...) \n",
    "            * %b : 月の英語名の省略形 (Jan, ...)\n",
    "            * %c : 日付と時刻\n",
    "            * %d : 日\n",
    "            * %H : 24時間制の時\n",
    "            * %I : 12時間制の時\n",
    "            * %j : 年中の通算日\n",
    "            * %M : 分\n",
    "            * %m : 月\n",
    "            * %p : AM, PM\n",
    "            * %S : 秒\n",
    "            * %U : 週を表す数。最初の日曜日が第一週の始まり (00-53)\n",
    "            * %W : 週を表す数。最初の日曜日が第一週の始まり (00-53)\n",
    "            * %w : 曜日を表す数。日曜日が0 (0-6)\n",
    "            * %X : 時刻\n",
    "            * %x : 日付\n",
    "            * %Y : 西暦\n",
    "            * %y : 西暦下二桁\n",
    "            * %Z : タイムゾーン\n",
    "            * %% : %\n",
    "          \n",
    "            "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1486128930\n",
      "1486128930\n",
      "1486128930.004\n",
      "[30, 35, 13, 3, 2, 2017, 5, 34, false, \"UTC\"]\n",
      "2017-02-03 13:35:30 +0000\n"
     ]
    }
   ],
   "source": [
    "t = Time.mktime(2017,2,3,13,35,30,4000) \n",
    "puts t.to_i\n",
    "puts t.tv_sec\n",
    "puts t.to_f\n",
    "puts t.to_a\n",
    "puts t.to_s"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "曜日や月のアルファベット表記\n",
      "Friday, Fri\n",
      "February, Feb\n",
      "\n",
      "日付や時刻など\n",
      "02\n",
      "35\n",
      "03\n",
      "14\n",
      "02\n",
      "PM\n",
      "30\n",
      "2017\n",
      "17\n",
      "\n",
      "組み合わせて表示\n",
      "2017/02/03 PM 02:35:30\n",
      "03/02/17 14:35:30\n",
      "\n",
      "最初の日曜日が0(2017年1月29日)。5なので5日経過している(2017年2月3日)\n",
      "05\n",
      "05\n",
      "曜日。5なので金曜日\n",
      "5\n",
      "\n",
      "14:35:30\n",
      "02/03/17\n",
      "Fri Feb  3 14:35:30 2017\n",
      "\n",
      "1月1日から34日経過\n",
      "034\n",
      "タイムゾーン\n",
      "UTC\n"
     ]
    }
   ],
   "source": [
    "t = Time.mktime(2017,2,3,14,35,30,4000) \n",
    "\n",
    "puts \"曜日や月のアルファベット表記\"\n",
    "puts t.strftime(\"%A, %a\")\n",
    "puts t.strftime(\"%B, %b\")\n",
    "puts\n",
    "\n",
    "puts \"日付や時刻など\"\n",
    "puts t.strftime(\"%m\")\n",
    "puts t.strftime(\"%M\")\n",
    "puts t.strftime(\"%d\")\n",
    "puts t.strftime(\"%H\")\n",
    "puts t.strftime(\"%I\")\n",
    "puts t.strftime(\"%p\")\n",
    "puts t.strftime(\"%S\")\n",
    "puts t.strftime(\"%Y\")\n",
    "puts t.strftime(\"%y\")\n",
    "puts\n",
    "\n",
    "puts \"組み合わせて表示\"\n",
    "puts t.strftime(\"%Y/%m/%d %p %I:%M:%S\")\n",
    "puts t.strftime(\"%d/%m/%y %H:%M:%S\")\n",
    "puts\n",
    "\n",
    "puts \"最初の日曜日が0(2017年1月29日)。5なので5日経過している(2017年2月3日)\"\n",
    "puts t.strftime(\"%U\")\n",
    "puts t.strftime(\"%W\")\n",
    "puts \"曜日。5なので金曜日\"\n",
    "puts t.strftime(\"%w\")\n",
    "puts \n",
    "\n",
    "puts t.strftime(\"%X\")\n",
    "puts t.strftime(\"%x\")\n",
    "puts t.strftime(\"%c\")\n",
    "puts\n",
    "\n",
    "puts \"1月1日から34日経過\"\n",
    "puts t.strftime(\"%j\")\n",
    "puts \"タイムゾーン\"\n",
    "puts t.strftime(\"%Z\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Ruby 2.3.1",
   "language": "ruby",
   "name": "ruby"
  },
  "language_info": {
   "file_extension": ".rb",
   "mimetype": "application/x-ruby",
   "name": "ruby",
   "version": "2.3.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
